/*
 * Diese Klasse dient zum eigentlichen Auslesen der RSS-Feeds und umformen in Entry-Objekte
 * 
 */

package com.logic;

/**
 *
 * @author Dell
 */
import com.objects.entry;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;



public class rssparser {

        //entries dient als Rückgabewert, des ausgelesenen Feeds
        private ArrayList<entry> entries=new ArrayList<entry>();
        //URL des Feeds
	private  URL url;
        //ID des Feeds
        private int feedID;

        //Konstruktor, der die URL und die ID des auszulesenden Feeds annimmt
	public rssparser(String feedUrl,int fID) {
		try {
                        //ID des Feeds der globalen Variable feedID zuweisen
                        this.feedID=fID;
                        //URL des Feeds als URL-Objekt anlegen und zuweisen
			this.url = new URL(feedUrl);
		} catch (MalformedURLException e) {
			throw new RuntimeException(e);
		}
	}

	@SuppressWarnings("null")

        //diese Funktion liest den jeweiligen Feed und speichert die Einträge als Entry-Objekte in der ArrayList entries als Rückgabeparameter
	public ArrayList<entry> readFeed() throws MalformedURLException, IOException {

		try {
                        //Bildet später die übermittelte Beschreibung des Eintrags
                        String description="";
                        //Bildet später den übermittelten Titel des Eintrags
			String title="";
                        //Bildet später den übermittelten Link des Eintrags
			String link="";
                        //Bildet später das Veröffentlichungsdatum des Eintrags
			String pubdate ="";
                        //Indikator, ob der Feedheader ausgelesen wird, oder schon die Items des Feeds
			boolean isFeedHeader = true;
			

			// XMLInputFactory als neue Instanz zum auslesen des Feeds erzeugen
			XMLInputFactory inputFactory = XMLInputFactory.newInstance();
			// Neuen Eventreader einrichten mit der URL des Feeds über die Funktion read()
			InputStream in = read();
			XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
			// Das XML-Dokument, also den Feed, Item für Item durchlaufen
			while (eventReader.hasNext()) {
                                //auf nächsten Element zeigen
				XMLEvent event = eventReader.nextEvent();
                                //Wenn das Element ein Startelement ist
				if (event.isStartElement()) {
                                        //wenn das Element ein Item-Element ist
					if (event.asStartElement().getName().getLocalPart() == ("item")) {
                                                //wenn es das erste Item-Element ist (FeedHeader also noch wahr ist)
						if (isFeedHeader) {
                                                        //setze FeedHeader auf falsch
							isFeedHeader = false;

						}
                                                //steuere das nächste Element an und fahre fort
						event = eventReader.nextEvent();
						continue;
					}
                                        //wenn das Element ein Title-Element ist
					if (event.asStartElement().getName().getLocalPart() == ("title")) {
                                                //lese den Event-Inhalt aus und speichere ihn in der title-Variable
						event = eventReader.nextEvent();
						title = event.asCharacters().getData();
						continue;
					}
                                        //wenn das Element ein Description-Element ist
					if (event.asStartElement().getName().getLocalPart() == ("description")) {
						//lese den Event-Inhalt und speichere ihn in der description-Variable
                                                event = eventReader.nextEvent();
                                                description=event.asCharacters().getData().toString();
						continue;
					}
                                        //wenn das Element ein Link-Element ist
					if (event.asStartElement().getName().getLocalPart() == ("link")) {
                                                //lese den Event-Inhalt und speichere ihn in der link-Variable
						event = eventReader.nextEvent();
						link= event.asCharacters().getData();
						continue;
					}
                                        //wenn das Element ein Pubdate-Element ist
                                        if (event.asStartElement().getName().getLocalPart() == ("pubDate")) {
                                                //lese den Event-Inhalt aus und speichere ihn in der pubdate-Variable
						event = eventReader.nextEvent();
						pubdate= event.asCharacters().getData();
						continue;
					}
                                //Wenn das Element ein schließendes Endelement ist
				} else if (event.isEndElement()) {
                                        //wenn das Element ein Item-Element ist
					if (event.asEndElement().getName().getLocalPart() == ("item")) {
                                            //erstelle ein leeres (Standardkonstruktor) entry-Objekt
                                            entry message = new entry();
                                                //wenn das Veröffentlichungsdatum nicht gefunden wurde
                                                if (pubdate=="")
                                                {
                                                    //überschreibe das leere entry-Objekt mit einem neuen Entry-Objekt mit dem jetzigen Datum
                                                     message = new entry(title, feedID, description,new Date(), link);

                                                }
                                            //sonst
                                               else
                                                {
                                                    //überschreibe das leere entry-Objekt mit einem neuen Entry-Objekt mit dem ausgelesenem Datum
                                                   message = new entry(title, feedID, description,new Date(pubdate), link);

                                                }
                                                //füge der ArrayList das neue Entry-Objekt hinzu und fahre fort
						entries.add(message);
						event = eventReader.nextEvent();
						continue;
					}
				}
			}
		} catch (XMLStreamException e) {
			throw new RuntimeException(e);
		}
                //geben alle Einträge des Feeds als ArrayList von entry-Objekten zurück
		return entries;

	}

        //Funktion, die einen InputStream der Feed-URL zurückgibt und Fehler ggf. auffängt
	private InputStream read() {
		try {
			return url.openStream();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
}

